import nspell from 'nspell';

// 直接嵌入aff规则文件内容
const affContent = `# 英语拼读规则文件
# 用于单词拆分和符合英语学习习惯的拼读

# 设置语言编码
SET UTF-8

# 定义常见的字母组合及其发音规则
# 这些规则将用于正确拆分单词，符合英语学习习惯

# 三字母组合
TRIPLE ch
TRIPLE sh
TRIPLE th
TRIPLE wh
TRIPLE ph
TRIPLE ng
TRIPLE nk 

# 常见的辅音组合（双字母）
PAIR bl
PAIR br
PAIR cl
PAIR cr
PAIR dr
PAIR fr
PAIR gr
PAIR pl
PAIR pr
PAIR sc
PAIR sk
PAIR sl
PAIR sm
PAIR sn
PAIR sp
PAIR st
PAIR sw
PAIR tr
PAIR tw

# 常见的元音组合
PAIR ai
PAIR ay
PAIR ee
PAIR ea
PAIR oa
PAIR ou
PAIR ie
PAIR ei
PAIR ue
PAIR ui
PAIR oo
PAIR ow
PAIR oi
PAIR oy
PAIR au
PAIR aw

# 三字母组合（更复杂的）
PAIR thr
PAIR shr
PAIR sch
PAIR scr
PAIR squ
PAIR spl
PAIR spr
PAIR str
PAIR scr
PAIR squ

# 发音规则标志
# 用于指示特定字母组合的发音方式
FLAG m # 辅音组合
FLAG v # 元音组合
FLAG t # 三字母组合

# 定义前缀
PFX A Y 1
PFX A 0 un -
PFX A 0 re -
PFX A 0 dis -
PFX A 0 pre -
PFX A 0 mis -

# 定义后缀
SFX B Y 1
SFX B 0 s -
SFX B 0 es -
SFX B 0 ed -
SFX B 0 ing -
SFX B 0 ly -
SFX B 0 ful -
SFX B 0 ness -
`;

// 直接嵌入dic字典文件内容
const dicContent = `5
hello
world
school
teacher
student
`;

/**
 * 初始化Hunspell拼写检查器
 * @returns {Object} 初始化后的nspell实例
 */
let spellChecker = null;

/**
 * 加载Hunspell规则和字典
 * @returns {Promise<void>} 加载完成的Promise
 */
export const loadHunspellRules = async () => {
  try {
    // 直接使用嵌入的规则和字典内容创建nspell实例
    spellChecker = nspell(affContent, dicContent);
    console.log('Hunspell rules loaded successfully');
  } catch (error) {
    console.error('Failed to load Hunspell rules:', error);
    // 在加载失败时使用备用方案
    spellChecker = {
      correct: () => false,
      suggest: () => []
    };
  }
};

/**
 * 根据英语学习习惯拆分单词
 * @param {string} word - 要拆分的单词
 * @returns {string[]} 拆分后的字母组合数组
 */
export const splitWordByHunspellRules = (word) => {
  if (!word || typeof word !== 'string') return [];
  
  const lowerWord = word.toLowerCase();
  const result = [];
  let i = 0;
  
  // 基于我们在aff文件中定义的规则进行单词拆分
  while (i < lowerWord.length) {
    // 优先检查三字母组合
    if (i + 3 <= lowerWord.length) {
      const triple = lowerWord.substr(i, 3);
      if (['thr', 'shr', 'sch', 'scr', 'squ', 'spl', 'spr', 'str', 'scr' ].includes(triple)) {
        result.push(triple);
        i += 3;
        continue;
      }
    }
    
    // 检查双字母组合
    if (i + 2 <= lowerWord.length) {
      const pair = lowerWord.substr(i, 2);
      // 辅音组合
      if (['bl', 'br', 'cl', 'cr', 'dr', 'fr', 'gr', 'pl', 'pr', 'sc', 'sk', 
           'sl', 'sm', 'sn', 'sp', 'st', 'sw', 'tr', 'tw'].includes(pair)) {
        result.push(pair);
        i += 2;
        continue;
      }
      // 元音组合
      if (['ai', 'ay', 'ee', 'ea', 'oa', 'ou', 'ie', 'ei', 'ue', 'ui', 'oo', 
           'ow', 'oi', 'oy', 'au', 'aw'].includes(pair)) {
        result.push(pair);
        i += 2;
        continue;
      }
      // 特殊组合
      if (['ch', 'sh', 'th', 'wh', 'ph', 'ng', 'nk'].includes(pair)) {
        result.push(pair);
        i += 2;
        continue;
      }
    }
    
    // 如果不是特殊组合，添加单个字母
    result.push(lowerWord.substr(i, 1));
    i += 1;
  }
  
  return result;
};

/**
 * 根据Hunspell规则获取单词的拼读形式
 * @param {string} word - 要拼读的单词
 * @returns {string} 格式化后的拼读字符串
 */
export const getWordPhoneticSpelling = (word) => {
  if (!word) return '';
  
  const splitResult = splitWordByHunspellRules(word);
  // 使用空格连接拆分后的字母组合
  return splitResult.join('  ');
};

/**
 * 检查单词拼写是否正确
 * @param {string} word - 要检查的单词
 * @returns {boolean} 拼写是否正确
 */
export const isWordSpelledCorrectly = (word) => {
  if (!spellChecker || !word) return false;
  
  try {
    return spellChecker.correct(word);
  } catch (error) {
    console.error('Error checking word spelling:', error);
    return false;
  }
};

/**
 * 获取单词的拼写建议
 * @param {string} word - 要获取建议的单词
 * @returns {string[]} 拼写建议数组
 */
export const getSpellingSuggestions = (word) => {
  if (!spellChecker || !word) return [];
  
  try {
    return spellChecker.suggest(word);
  } catch (error) {
    console.error('Error getting spelling suggestions:', error);
    return [];
  }
};

// 导出默认对象以便在其他地方使用
export default {
  loadHunspellRules,
  splitWordByHunspellRules,
  getWordPhoneticSpelling,
  isWordSpelledCorrectly,
  getSpellingSuggestions
};